<?php
/////////////////////////////////////////////////////////////////////////////
// 
//
// workflow_system
//
// workflow_copyright
// 
/////////////////////////////////////////////////////////////////////////////

/**
 * FILE_NAME : adodb.core.php   FILE_PATH : \\classes\core\adodb.core.php
 * ....Adodb数据库操作类
 *
 * @copyright workflow_system 
 * @author workflow Develop Team 
 * @package 
 * @subpackage 
 * @version Wed Nov 07 10:31:07 CST 2007
 */

class DBEngine{
	/**
	 * 负责读数据库的数据库连接对象
	 *
	 * @var object
	 */
	var $_conn;
	/**
	 * 负责写数据库的数据库连接对象
	 *
	 * @var object
	 */
	var $_conn_write;
	/**
	 * 数据库表前缀
	 *
	 * @var string
	 */
	var $_dbprefix;
	
	/**
	 * 其他数据库连接
	 *
	 * @var string
	 */
	var $_sys_conn_conn;
	var $_sys_conn_write;

	/**
	 * 连接数据库
	 *
	 */
	function _dbinitialize(){
		include_once('adodb.inc.php');

		/**
		 * 数据库类型
		 */
		$conn = &ADONewConnection($GLOBALS['dbconfig']['database_type']);

		/**
		 * 读数据库连接
		 */
		$conn->Connect($GLOBALS['dbconfig']['servername_read'],$GLOBALS['dbconfig']['username_read'],$GLOBALS['dbconfig']['password_read'],$GLOBALS['dbconfig']['databasename_read']);

		/**
		 * 如果是读写分开的，写数据库连接
		 */
		if ($GLOBALS['dbconfig']['database_read_write'] == 1){
			$conn_write = &ADONewConnection($GLOBALS['dbconfig']['database_type']);
			$conn_write->Connect($GLOBALS['dbconfig']['servername_write'],$GLOBALS['dbconfig']['username_write'],$GLOBALS['dbconfig']['password_write'],$GLOBALS['dbconfig']['databasename_write']);
		}else{
			$conn_write = $conn;
		}
		/**
		 * 是否是DEBUG模式
		 */
		if ($GLOBALS['dbconfig']['ifdebug'] == "true"){
			$conn->debug = true;
			$conn_write->debug = true;
		}
		else{
			$conn->debug = false;
			$conn_write->debug = false;
		}
		/**
		 * 设置表前缀
		 */
		$this->_dbprefix = $GLOBALS['dbconfig']['dbprefix'];
		$this->_conn = $conn;
		$this->_conn_write = $conn_write;
	}

	/**
	 * 将SQL语句里的表名称加上配置文件里的前缀
	 * 表名称必须用``括起来
	 * 返回值为加上了表前缀的SQL语句
	 * 例如，_settablename("select * from `member`")
	 * 得到的结果为，select * from `shopnc_member`
	 *
	 * @param string $strsql  SQL语句
	 * @return string
	 */
	function _settablename($strsql){
		if ($this->_dbprefix == ''){
			return $strsql;
		}
		$sqlarray = explode("`",$strsql);
		if (!is_array($sqlarray)){
			return $strsql;
		}else{
			for ($i=0;$i<count($sqlarray);$i++){
				if (($i+1)%2 == 0){
					if ($sqlarray[$i] == "")
					echo $strsql;
					if (!strstr($sqlarray[$i],$this->_dbprefix))
					$sqlarray[$i] = $this->_dbprefix . $sqlarray[$i];
				}
			}
			return implode("`",$sqlarray);
		}
	}

	/**
	 * 根据SQL查询语句，得到一定范围内的记录数组
	 * 例如，得到前10条记录：SelectLimit("select * from `member` ",10,0)
	 * 得到的结果形式如$rs[行号][列名]
	 * 
	 * @param string $strsql  sql查询语句
	 * @param int $count  需要的记录数
	 * @param int $offset  从第几条开始
	 * @return var[] 二维数组
	 */
	function SelectLimit($strsql,$count,$offset){
		$strsql = $this->_settablename($strsql);
		return $this->_conn->SelectLimit($strsql,$count,$offset);
	}

	/**
	 * 根据参数产生SQL插入语句
	 *
	 * @param object $rs 要插入的空记录结果集
	 * @param var[] $array 要插入的字段值，一维数组格式，$arr[列名] = 值
	 * @return string 返回的SQL语句
	 */
	function GetInsertSQL($rs,$array){
		return $this->_conn->GetInsertSQL($rs,$array);
	}

	/**
	 * 根据参数产生SQL更新语句
	 *
	 * @param object $rs 要更新的记录结果集
	 * @param var[] $array 要更新的字段值，一维数组格式，$arr[列名] = 值
	 * @return string 返回的SQL语句
	 */
	function GetUpdateSQL($rs,$array){
		return $this->_conn->GetUpdateSQL($rs,$array);
	}

	/**
	 * 执行SQL语句
	 *
	 * @param string $strsql sql语句
	 * @return var
	 */
	function Execute($strsql){
		$strsql = $this->_settablename($strsql);
		if (strtolower(substr($strsql,0,6)) == "select"){
			//如果是查询那么用读数据库连接对象执行
			return $this->_conn->Execute($strsql);
		}else{
			//如果是需要对数据库进行更改的操作那么用写数据库连接对象执行
			return $this->_conn_write->Execute($strsql);
		}
	}

	/**
	 * 得到一行信息放到数组中
	 *
	 * @param string $strsql SQL查询语句
	 * @return var[] 一维数组，形式如，$arr[列名]
	 */
	function GetRow($strsql){
		$strsql = $this->_settablename($strsql);
		return $this->_conn->GetRow($strsql);
	}

	/**
	 * 查询SQL语句，结果生成一个二维数组
	 * 形式如，$arr[行号][列名]
	 *
	 * @param string $strsql
	 * @return var[]
	 */
	function GetArray($strsql){
		$strsql = $this->_settablename($strsql);
		return $this->_conn->GetArray($strsql);
	}
	
	/**
	 * 执行SQL指令，并且以阵列的方式回传第一笔记录的第一个栏位。资料集及其馀的记录将会被自动清除，如果发生错误，就回传 false 值。
	 *
	 * @param string $strsql
	 * @return var
	 */
	function GetOne($strsql){
		$strsql = $this->_settablename($strsql);
		if (strtolower(substr($strsql,0,6)) == "select"){
			return $this->_conn->GetOne($strsql);
		}else{
			return $this->_conn_write->GetOne($strsql);
		}
	}
	
	/**
	 * 连接到其他数据库，其他数据库没有读写分离，在使用后需要执行clearconnect。未clearconnect前执行的操作都是针对这个数据库的。
	 *
	 * @param string $databasename
	 */
	function connect($databasename){
		/**
		 * 数据库类型
		 */
		$conn = &ADONewConnection($GLOBALS['dbconfig']['database_type']);

		/**
		 * 读数据库连接
		 */
		if ($conn->Connect($GLOBALS['dbconfig']['servername_read'],$GLOBALS['dbconfig']['username_read'],$GLOBALS['dbconfig']['password_read'],$databasename)){
			$this->_sys_conn_conn = $this->_conn;
			$this->_sys_conn_conn_write = $this->_conn_write;
			$this->_conn = $conn;
			$this->_conn_write = $conn;
			return true;
		}else{
			return false;
		}	
	}
	
	/**
	 * 恢复数据库的连接
	 *
	 */
	function clearconnect(){
		$this->_conn = $this->_sys_conn_conn;
		$this->_conn_write = $this->_sys_conn_conn_write;
	}
}
?>